package com.realone.packman.codec;

import com.realone.packman.codec.encoder.BmsEncoder;
import com.realone.packman.codec.encoder.BmsEncoderFactory;
import com.realone.packman.codec.encoder.vo.BmsEncoderDataVo;
import com.realone.packman.codec.encoder.vo.BmsEncoderDataVo01;
import com.realone.packman.codec.encoder.vo.BmsEncoderDataVo06;
import com.realone.packman.codec.encoder.vo.BmsEncoderDataVo07;
import com.realone.packman.codec.encoder.vo.BmsEncoderDataVo08;
import com.realone.packman.codec.encoder.vo.BmsEncoderDataVo09;

/**
 * @author hugx
 * @create 2018-09-13 17:38
 */
public class BmsReqCmd {

    /**
     * 获取BMS所有状态和数据
     * @param bmsEncoderVoBody
     * @return
     */
    public static byte[] getBmsAllStateData(BmsEncoderDataVo bmsEncoderVoBody){
              return getDataTemplate(BmsCodecConstant.Req_Cmd_0x00,bmsEncoderVoBody);
    }


    /**
     * 获取BMS电压
     * @param bmsEncoderDataVo01
     * @return
     */
    public static byte[] getBmsVoltageData(BmsEncoderDataVo01 bmsEncoderDataVo01){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x01,bmsEncoderDataVo01);
    }

    /**
     * 获取BMS电流
     * @param bmsEncoderDataVo
     * @return
     */
    public static byte[] getBmsElectricityData(BmsEncoderDataVo bmsEncoderDataVo){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x02,bmsEncoderDataVo);
    }

    /**
     * 获取BMS容量
     * @param bmsEncoderDataVo
     * @return
     */
    public static byte[] getBmsCapacityData(BmsEncoderDataVo bmsEncoderDataVo){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x03,bmsEncoderDataVo);
    }

    /**
     * 获取BMS温度
     * @param bmsEncoderDataVo
     * @return
     */
    public static byte[] getBmsTemperatureData(BmsEncoderDataVo bmsEncoderDataVo){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x04,bmsEncoderDataVo);
    }

    /**
     * 获取BMS湿度
     * @param bmsEncoderDataVo
     * @return
     */
    public static byte[] getBmsHumidityData(BmsEncoderDataVo bmsEncoderDataVo){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x05,bmsEncoderDataVo);
    }

    /**
     * 设置BMS放电参数
     * @param bmsEncoderDataVo06
     * @return
     */
    public static byte[] setBMSDisChargeParam(BmsEncoderDataVo06 bmsEncoderDataVo06){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x06,bmsEncoderDataVo06);
    }

    /**
     * 设置BMS充电参数
     * @param bmsEncoderDataVo07
     * @return
     *
     */
    public static byte[] setBMSChargeParam(BmsEncoderDataVo07 bmsEncoderDataVo07){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x07,bmsEncoderDataVo07);
    }

    /**
     * 设置BMS系统参数
     * @param bmsEncoderDataVo08
     * @return
     */
    public static byte[] setBmsSystemParam(BmsEncoderDataVo08 bmsEncoderDataVo08){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x08,bmsEncoderDataVo08);
    }

    /**
     * 参数配置管理
     * @param bmsEncoderDataVo09
     * @return
     */
    public static byte[] paramConfigManager(BmsEncoderDataVo09 bmsEncoderDataVo09){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x09,bmsEncoderDataVo09);
    }

    /**
     * 进入升级状态
     * @param bmsEncoderDataVo
     * @return
     */
    public static byte[] enterUpgradeState(BmsEncoderDataVo bmsEncoderDataVo){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x0a,bmsEncoderDataVo);
    }

    /**
     * 开始升级
     * @param bmsEncoderDataVo
     * @return
     */
    public static byte[] startUpgrade(BmsEncoderDataVo bmsEncoderDataVo){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x0b,bmsEncoderDataVo);
    }

    /**
     * 获取BMS保护参数
     * @param bmsEncoderDataVo
     * @return
     */
    public static byte[] getBmsProtectParam(BmsEncoderDataVo bmsEncoderDataVo){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x0c,bmsEncoderDataVo);
    }

    /**
     * 获取BMS系统参数
     * @param bmsEncoderDataVo
     * @return
     */
    public static byte[] getBmsSystemParam(BmsEncoderDataVo bmsEncoderDataVo){
        return getDataTemplate(BmsCodecConstant.Req_Cmd_0x0d,bmsEncoderDataVo);
    }


    /**
     *
     * @param cmd 操作码
     * @param bmsEncoderVoBody  请求对象 BmsEncoderDataVo
     * @return
     */
    private static byte[] getDataTemplate(int cmd,BmsEncoderDataVo bmsEncoderVoBody){
        BmsEncoder bmsEncoder= BmsEncoderFactory.createBmsEncoder((byte) cmd);
        if(bmsEncoder ==null){
            return null;
        }

        return  bmsEncoder.encoder((byte) cmd,bmsEncoderVoBody);

    }
}
